<?php
class APagoCliente
{
	public function __construct() {}
	public function generaRecibo(EFacade & $facade) 
	{
		
		epLoadConfig('../config.xml');
		$session=$facade->session;
		$m = epManager::instance();
		$doc = & $facade->getDocumentRoot();
	    $workflowNDC = & $facade->getWorkflow();
		$ezpdo_= getManager();
		$role=NULL;

		foreach($doc->listaCuotas as & $lista){
			$monto = & $lista->cuotaCliente->montoCuota;
			$montoNumero=stringToNumber($monto);
			$monto=$montoNumero;
			//$monto = $lista->cuotaCliente->montoCuota - $lista->totalPago;
		}
		
		
		//*********configuracion cuentas*************************//
		$network=$doc->workflowRef->networkRef;
		
		$query='FROM MConfiguracionCuenta as t WHERE t.documento.oid=?';
		$configuracion=$ezpdo_->find($query,$network->epGetObjectId());
		
		
		$cuentas=$configuracion[0]->cuenta;
		
		//************CUENTA VENTAS ACTUALIZACION********************************//
		foreach($cuentas as $c){
			
			if($c->posicion==1){
				
				$c->cuentaContable->disminuye($doc->totalAPagar,$doc);
				$c->cuentaContable->commit();
			}
		}
		
		if($doc->cuentaPorCobrar!=0){
			
			$query1='FROM MCuentaContable as t WHERE t.oid=?';
			$cuentaHja=$ezpdo_->find($query1,$doc->cuentaPorCobrar);
			$cuentaHja[0]->disminuye($doc->totalAPagar,$doc);
			$cuentaHja[0]->commit();
			
		}
		$cliente= & $doc->cliente;
		if($cliente->cuenta==NULL){
			$cuentaCliente=$session->create('MCuentaCliente');
			$cliente->cuenta=$cuentaCliente;
		}
		else{
			$cuentaCliente=&$cliente->cuenta;
		}
		//para asociarle a la cuenta los pagos realizados a cualkier cuota o giro.... carlos
		$cuenta = &$cuentaCliente;
		$cuenta->pagosCliente[] = $doc;
		$cuenta->saldo = $cuenta->saldo - $doc->totalAPagar;
		
		//se crea la clase ke lleva el historico del saldo y documento que afecto la cta cliente... carlos
		$historico = $session->create('MListaHistoricoCuentas');
		$historico->fecha = date('U');
		$historico->saldo = $cuenta->saldo ;
		$historico->credito = $doc->totalAPagar;
		$historico->documento = $doc;
		$doc->numero = $doc->getDocumentNumber();
		
		$historico->referencia = $doc->numero;
		$cuenta->historico[] = $historico;
		$cuenta->saldo = $cuenta->saldo - $doc->totalAPagar;
		$historico->commit();
		$cuenta->commit();
		$doc->commit();
		//****************************************************************
		
		$reciboCliente = $facade->session->create('DReciboCliente');
		
		$reciboCliente->departamento = $doc->departamento;//$dept[0];
		
		$reciboCliente->variante = $doc->variante;//$variant[0];
		
		$reciboCliente->epSetDirty(TRUE);
		$reciboCliente->cliente = $doc->cliente;
		$reciboCliente->fecha = date('U');
		$reciboCliente->pagoCliente = $doc;
		$reciboCliente->cantidad = $doc->totalAPagar;
		
		//crea el recibo cliente...... carlos
		
		$role=NULL;
		$newEfacade =& EFacade :: initWorkflow($facade->session, $reciboCliente, & $role);
		$transSet = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(),3);//tipo process
		$trans = $transSet->getTransByName('t1');
		$usuario=NULL;
		
		$newEfacade->fireTrans($trans, $usuario, "Creacion",TRUE);
		$newEfacade->saveWorkflow();
		
		$reciboCliente->commit();
		$reciboCliente->numero = $reciboCliente->getDocumentNumber();//echo "<br><br> es:2..1",
		$reciboCliente->commit();
		$reciboCliente->diferenciador=$reciboCliente->getDocumentDifer();
		$reciboCliente->commit();
		/////////
		
		///FALTA DISPARAR EL INGRESO EXTRA
		///EN CASO DE KE TENGA ASOCIADO GIRO, DISPARAR LA TRANSICION T3 ACTUAL DEL GIRO.... CARLOS
		
		if(count($doc->giroCliente)){
			foreach($doc->giroCliente as &$giro){
				$giro->pagoCliente = $doc;
				
				$user=NULL;
				$workflowF = & $giro->getWorkflowRef();
				
				$newEfacade10 =& EFacade :: initWorkflowWithoutRole($facade->session,$giro,/* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
				$placeSetReq = & EFacade :: getCurrentPlaceSet($newEfacade10->getWorkflow());
				$wfReq0=$newEfacade10->getWorkflow();
				
				$transSetReq0 = & EFacade :: getCurrentTransSetAuto($newEfacade10->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
				$transReq = & $transSetReq0->getTransByName('t3');		
				$newEfacade10->fireTrans($transReq, $user, "Culminar",TRUE);
			
				$giro->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
				$wfReq0->epSetDirty(TRUE);
			
				$wfReq0->commit();
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
				
			
				//disparo del prestamo para ver si termino
				if($giro->prestamoAExterno){
					$prestamoExterno = $giro->prestamoAExterno;
					
					$user=NULL;
					$workflowF = & $prestamoExterno->getWorkflowRef();
					
					$newEfacade1 =& EFacade :: initWorkflowWithoutRole($facade->session,$prestamoExterno,/* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$placeSetReq = & EFacade :: getCurrentPlaceSet($newEfacade1->getWorkflow());
					$wfReq1=$newEfacade1->getWorkflow();
					
					$transSetReq = & EFacade :: getCurrentTransSetAuto($newEfacade1->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$transReq = & $transSetReq->getTransByName('t3');		
					$newEfacade1->fireTrans($transReq, $user, "Culminar",TRUE);
				
					$prestamoExterno->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
					$wfReq1->epSetDirty(TRUE);
				
					$wfReq1->commit();
					$facade->session->evictAll('MEdge');
					$facade->session->evictAll('MTrans');
					$facade->session->evictAll('MPlace');
				}
				
				if($giro->factura){
					
					$facturaGiro = $giro->factura;
					
					$user=NULL;
					$workflowF = & $facturaGiro->getWorkflowRef();
					
					$newEfacadeGiro =& EFacade :: initWorkflowWithoutRole($facade->session,$facturaGiro,/* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$placeSetReq = & EFacade :: getCurrentPlaceSet($newEfacadeGiro->getWorkflow());
					$wfReqGiro=$newEfacadeGiro->getWorkflow();
					
					$transSetReq1 = & EFacade :: getCurrentTransSetAuto($newEfacadeGiro->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$transReq = & $transSetReq1->getTransByName('t4');		
					$newEfacadeGiro->fireTrans($transReq, $user, "Culminar",TRUE);
				
					$facturaGiro->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
					$wfReqGiro->epSetDirty(TRUE);
				
					$wfReqGiro->commit();
					$facade->session->evictAll('MEdge');
					$facade->session->evictAll('MTrans');
					$facade->session->evictAll('MPlace');
				}
			}
		}
		//echo '<br>paso por actualizacion de giros';
		$oids = array();
		$cadena ='';
		
		
		foreach($doc->listaCuotas as & $cuotas){
			//echo '<br>entro al for de cuotas';
			$cuota = & $cuotas->cuotaCliente;
			$cuota->epSetDirty(TRUE);
			$cuotas->cuotaCliente->abono = $cuotas->cuotaCliente->abono + stringToNumber($cuotas->totalPago);
			$cuota->fechaUltimoPago = date('U');
			
			if($cuota->abono == $cuota->montoCuota){
				
				$cuota->status = true;
				
			}
			//echo '<br>pasa por status de cuota';
			$cuota->commit();
			
			///FALTA DISPARAR EL INGRESO EXTRA
			if($cuota->factura){
				
				$cadena = ' AND c.oid='.$cuota->epGetObjectId();
		
				$queryDep='FROM DFacturaCliente as t WHERE t.cuotas.contains(c) '.$cadena;
				$facturas = $ezpdo_->find($queryDep);
				
				$factura = $facturas[0];
				
				
				$user=NULL;
				$workflowF = & $factura->getWorkflowRef();
				
				$newEfacade12 =& EFacade :: initWorkflowWithoutRole($facade->session,$factura,/* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
				$placeSetReq = & EFacade :: getCurrentPlaceSet($newEfacade12->getWorkflow());
				$wfReq=$newEfacade12->getWorkflow();
				
				if($placeSetReq->name != 'ps3'){//culminado en totalidad
					$transSetReq1 = & EFacade :: getCurrentTransSetAuto($newEfacade12->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$transReq = & $transSetReq1->getTransByName('t4');
					
					$newEfacade12->fireTrans($transReq, $user, "Culminar",TRUE);
				
					$factura->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
					$wfReq->epSetDirty(TRUE);
				
					$wfReq->commit();//echo '<br>1ro ',$factura;
				}
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
			}
			else{
				
				$cadena = ' AND c.oid='.$cuota->epGetObjectId();
		
				$queryDep='FROM DPrestamoAExternos as t WHERE t.cuotaCliente.contains(c) '.$cadena;
				$prestamos = $ezpdo_->find($queryDep);
				
				$prestamo = $prestamos[0];
				$m->refresh($prestamo);
				
				$placeSet = & EFacade :: getCurrentPlaceSet($prestamo->workflowRef);
				if($placeSet->name != 'ps5'){//culminado en totalidad
					$user=NULL;
					$workflowF = & $prestamo->getWorkflowRef();
					
					$newEfacade1 =& EFacade :: initWorkflowWithoutRole($facade->session,$prestamo,/* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$placeSetReq = & EFacade :: getCurrentPlaceSet($newEfacade1->getWorkflow());
					$wfReq10=$newEfacade1->getWorkflow();
					
					$transSetReq = & EFacade :: getCurrentTransSetAuto($newEfacade1->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);				
					$transReq = & $transSetReq->getTransByName('t3');		
					$newEfacade1->fireTrans($transReq, $user, "Culminar",TRUE);
				
					$prestamo->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
					$wfReq10->epSetDirty(TRUE);
				
					$wfReq10->commit();
				}
				$facade->session->evictAll('MEdge');
				$facade->session->evictAll('MTrans');
				$facade->session->evictAll('MPlace');
			}
			
			
		}
		
		
		
		
		$notasCredito=$doc->notaCreditoList;
		
		foreach($notasCredito as $notaList ){
			$monto=$notaList->monto;
			$totalPagado+=$monto;
			$DNota=$notaList->nota;
			$importe=$DNota->importeTotal;
			$montoUsado=$DNota->montoUsado;
			$montoUsadoNuevo=$montoUsado+$monto;
			$DNota->montoUsado=$montoUsadoNuevo;
			$nuevoImporte=$importe-$monto;
			$DNota->importeTotal=$nuevoImporte;
			
			$DNota->commit();			
			//habilitar la red y disparar
			
			/**TODO: Verificar esto
			 * 
			 */
			 
			 
//			$newEfacade =& EFacade :: initWorkflow($facade->session, $DNota, & $role);
//			//echo "<br>Inicia el wf de orden de actividad";
//			//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
//			$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
//			//echo "newefacde de OA es: ",$newEfacade;
//			//echo "<br>el transsetOT es: ",$transSetOT;
//			$transOT = $transSetOT->getTransByName('t3');
//			//echo "<br>transOA",$transOT;
//			$usuario=NULL;
//			$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
////						echo "<br><br>EL DOCROOT ES: ",$docRoot;
//			$DNota->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
//			$newEfacade->saveWorkflow();
//			$DNota->commit();
//			//echo "<br>acabo de crerar el giro ",$docGC;
//			unset($newEfacade);
//			$facade->session->evictAll('MEdge');
//			$facade->session->evictAll('MTrans');
//			$facade->session->evictAll('MPlace');
		}
		
		
		$notasDevolucion=$doc->notaDevolucionList;
		
		foreach($notasDevolucion as $notaList ){
			$monto=$notaList->monto;
			$totalPagado+=$monto;
			$DNota=$notaList->notaDevolucion;
			$importe=$DNota->importeTotal;
			$montoUsado=$DNota->montoUsado;
			$montoUsadoNuevo=$montoUsado+$monto;
			$DNota->montoUsado=$montoUsadoNuevo;
			$nuevoImporte=$importe-$monto;
			$DNota->importeTotal=$nuevoImporte;
			$DNota->commit();					
			//habilitar la red y disparar
			
			/**TODO: Verificar esto
			 * 
			 */
			 
			 
//			$newEfacade =& EFacade :: initWorkflow($facade->session, $DNota, & $role);
//			//echo "<br>Inicia el wf de orden de actividad";
//			//echo "la orden de actividad tiene asociada :",$docRoot->ordenOriginal;
//			$transSetOT = & EFacade :: getCurrentTransSetAuto($newEfacade->getWorkflow(), /* MTrans :: $TYPE_AUTO_PROCESS */ 3);
//			//echo "newefacde de OA es: ",$newEfacade;
//			//echo "<br>el transsetOT es: ",$transSetOT;
//			$transOT = $transSetOT->getTransByName('t3');
//			//echo "<br>transOA",$transOT;
//			$usuario=NULL;
//			$newEfacade->fireTrans($transOT, $usuario, "actualizar",TRUE);
////						echo "<br><br>EL DOCROOT ES: ",$docRoot;
//			$DNota->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
//			$newEfacade->saveWorkflow();
//			$DNota->commit();
//			//echo "<br>acabo de crerar el giro ",$docGC;
//			unset($newEfacade);
//			$facade->session->evictAll('MEdge');
//			$facade->session->evictAll('MTrans');
//			$facade->session->evictAll('MPlace');
		}
		
		$anticipos=$doc->listaAnticipos;
		foreach($anticipos as $anticipo ){
			
			$totalPago=$anticipo->totalPago;
			$anticipo->totalPago=stringToNumber($totalPago);
			$docAC= &$anticipo->anticipoCliente;
			$montoUsado=$docAC->montoUsado;
			$importeTotal=$docAC->importeTotal;
			if($totalPago <= ($importeTotal-$montoUsado)){
				$montoUsadoNuevo=$montoUsado+stringToNumber($totalPago);
			
			}
			$docAC->montoUsado=$montoUsadoNuevo;
			
			//$docAC->commit();					
			//habilitar la red y disparar
			
			/**TODO: Verificar esto
			 * 
			 */
		 
			 
			$role=NULL;
			$newEfacade =& EFacade :: initWorkflowWithoutRole($facade->session, $docAC, & $role);
				//$newEfacade =& EFacade :: initWorkflow($facade->session, $docAC, & $role);
				$docAC->workflowRef;
				$newEfacade->getCurrentTransSet($docAC->workflowRef,$role);
				$transSet = & EFacade :: getCurrentTransSetAuto($docAC->workflowRef,3);//tipo process
				$trans = $transSet->getTransByName('t3');
				$usuario=NULL;
				$newEfacade->fireTrans($trans, $usuario, "Actualizar",TRUE);
				//echo "<br><br>la wt es: ";
				$docAC->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios
				//echo '<br>placeSet Despues ',$newEfacade->getCurrentPlaceSet($docAC->workflowRef);
				$newEfacade->saveWorkflow();
			 $docAC->commit();
			//echo "<br>acabo de crerar el giro ",$docGC;
			unset($newEfacade);
			$facade->session->evictAll('MEdge');
			$facade->session->evictAll('MTrans');
			$facade->session->evictAll('MPlace');
		}
		
		
		
		//echo '<br>salio for de cuotas';
		$saldoCuentaCliente = & $doc->cliente->cuenta->saldo;
		$cantidad = 0;
		foreach($doc->formaPagoList as & $pago){
			$cantidad = $cantidad + $pago->montoPago;
			
			if($pago->formaPago->cuentaCaja){
				$pago->formaPago->cuentaCaja->cuentaContable->aumenta(stringToNumber($pago->montoPago),$doc);
				$pago->formaPago->cuentaCaja->cuentaContable->commit();
			}
			if($pago->formaPago->cuentaBancaria){
				$pago->formaPago->cuentaBancaria->cuentaContable->aumenta(stringToNumber($pago->montoPago),$doc);
				$pago->formaPago->cuentaBancaria->cuentaContable->commit();
			}
			
		}
		
		//$saldoCuentaCliente = $saldoCuentaCliente - $cantidad;
		

		//echo '<br>2do ',$reciboCliente;
		$doc->epSetDirty(TRUE);// marcar el documento para que sea salvado los cambios en su lista de items
		$workflowNDC->epSetDirty(TRUE);
		$facade->saveWorkflow();			
		
		$transSetSA = & EFacade :: getCurrentTransSetAuto($workflowNDC, 2); //TYPE AUTO AGENT
		$role=NULL;
		$transSA = $transSetSA->getTransByName('t2');
		$facade->fireTrans($transSA,$role,'actualizar cuentas', TRUE);
		
		$m->evictAll('MCuotaCliente');
		//echo '<br>3ro ',$doc;
	}
}
?>